Jackson এর জন্য Unit Test তৈরি করতে আমরা সাধারণত JUnit এবং ObjectMapper ব্যবহার করি। Unit Test-এ আমরা Jackson-এর serialization (Java থেকে JSON) এবং deserialization (JSON থেকে Java) প্রক্রিয়াগুলো যাচাই করি।
Unit Test এর ধাপসমূহ
- Dependency Management:
JUnitএবংJacksonএর প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করা। - Test Setup:
ObjectMapperইন্সট্যান্স তৈরি করা। - Serialization Test: Java Object থেকে JSON-এ সঠিক রূপান্তর নিশ্চিত করা।
- Deserialization Test: JSON থেকে Java Object-এ সঠিক রূপান্তর নিশ্চিত করা।
- Edge Case Handling: অপ্রত্যাশিত বা ভুল ডেটার জন্য টেস্টিং।
Maven Dependencies
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
Java Model Class
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
@JsonProperty("user_name")
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
// Getters এবং Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && name.equals(user.name);
}
}
Unit Test Code
১. Serialization Test
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class UserSerializationTest {
@Test
public void testSerialization() throws Exception {
// Arrange
User user = new User("John Doe", 25);
ObjectMapper objectMapper = new ObjectMapper();
// Act
String json = objectMapper.writeValueAsString(user);
// Assert
String expectedJson = "{\"user_name\":\"John Doe\",\"age\":25}";
assertEquals(expectedJson, json);
}
}
২. Deserialization Test
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class UserDeserializationTest {
@Test
public void testDeserialization() throws Exception {
// Arrange
String json = "{\"user_name\":\"John Doe\",\"age\":25}";
ObjectMapper objectMapper = new ObjectMapper();
// Act
User user = objectMapper.readValue(json, User.class);
// Assert
User expectedUser = new User("John Doe", 25);
assertEquals(expectedUser, user);
}
}
৩. Edge Case Test
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class UserEdgeCaseTest {
@Test
public void testInvalidJson() {
// Arrange
String invalidJson = "{\"user_name\":\"John Doe\",\"age\":\"invalid\"}";
ObjectMapper objectMapper = new ObjectMapper();
// Act and Assert
assertThrows(Exception.class, () -> objectMapper.readValue(invalidJson, User.class));
}
@Test
public void testMissingField() throws Exception {
// Arrange
String partialJson = "{\"user_name\":\"John Doe\"}";
ObjectMapper objectMapper = new ObjectMapper();
// Act
User user = objectMapper.readValue(partialJson, User.class);
// Assert
User expectedUser = new User("John Doe", 0); // Default age is 0
assertEquals(expectedUser, user);
}
}
৪. Custom Serializer/Deserializer Test
Custom Serializer
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class CustomUserSerializer extends JsonSerializer<User> {
@Override
public void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("full_name", user.getName().toUpperCase());
gen.writeNumberField("user_age", user.getAge());
gen.writeEndObject();
}
}
Custom Serializer Test
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CustomSerializerTest {
@Test
public void testCustomSerializer() throws Exception {
// Arrange
User user = new User("John Doe", 25);
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(User.class, new CustomUserSerializer());
objectMapper.registerModule(module);
// Act
String json = objectMapper.writeValueAsString(user);
// Assert
String expectedJson = "{\"full_name\":\"JOHN DOE\",\"user_age\":25}";
assertEquals(expectedJson, json);
}
}
পরীক্ষার কাভারেজ
- Serialization: Java Object → JSON।
- Deserialization: JSON → Java Object।
- Edge Cases: যেমন ভুল ডেটা টাইপ, মিসিং ফিল্ড।
- Custom Serializer/Deserializer।
- Exception Handling।
- JUnit: Jackson-এর serialization এবং deserialization প্রক্রিয়া যাচাই করার জন্য সহজ এবং কার্যকর।
- Edge Cases: ভুল JSON ডেটা এবং মিসম্যাচ ফিল্ডের জন্য পরীক্ষা করুন।
- Custom Logic: কাস্টম Serializer/Deserializer এর জন্য টেস্ট রাইটিং অত্যন্ত গুরুত্বপূর্ণ।
- Automation: Unit Test কোড Jackson-এর সাথে কাজ করার সময় সঠিকতা নিশ্চিত করে এবং বাগ কমায়।
Content added By
Read more